/**
 * 懒汉式单例模式，不安全
 * */
class LazySingleton{
    private static LazySingleton instance;//进行初始化，需要的时候才创建实例
    private LazySingleton(){}
    public static LazySingleton getInstance(){
        if(instance==null){//判断实例是否存在，不存在则创建
            instance=new LazySingleton();//创建实例，但在多线程环境下可能会创建多个实例，因此会违背单例模式，造成线程不安全
        }
        return instance;
    }
}
public class demo3 {
    public static void main(String[] args) throws InterruptedException {
        Thread[] threads=new Thread[10];
        LazySingleton[] instances=new LazySingleton[10];
        //创建多个线程，模拟多线程环境
        for(int i=0;i<10;i++) {
            final int index = i;
            threads[i] = new Thread(() -> {
                instances[index] = LazySingleton.getInstance();
                System.out.println("线程" + Thread.currentThread().getName() + "获取的实例地址：" + instances[index]);

            });
        }
        for(Thread thread:threads) {//启动所有线程
            thread.start();
        }
        for(Thread thread:threads) {//等待所有线程结束
            thread.join();
        }
        //检查是否所有线程获取的实例地址相同
        boolean allSame=true;
        for(int i=1;i<10;i++) {
            if(instances[0]!=instances[i]) {
                allSame=false;
                break;
            }
        }
        System.out.println("所有实例都相同:"+allSame);
        if(!allSame) {
            System.out.println("说明LazySingleton在多线程环境下是不安全的");
        }
    }
}
